/*
封装的请求方法，包含：
axios请求拦截
error msg弹框
路由跳转
非常规请求逻辑处理，如：下载，动态图片验证码
*/
import axios from "axios";
import { message } from "ant-design-vue";
import router from "@/router";
const service = axios.create({
  baseURL: "/api/", // api的base_url
  timeout: 1000 * 60 * 5, // 请求超时时间，默认5分钟
});


const filterPath=[
  'captcha.jpg',
  'download',
  'export',
  'expoetTable',
  'downLoad',
]
/**
 * 响应拦截
 * 用于处理需要在请求返回后的操作
 */
service.interceptors.response.use(
  (response) => {
    const { code, msg } = response.data;
    // 排除请求验证码图片的接口
    if (
      filterPath.some((item) => {
        return response.config.url.indexOf(item) !== -1;
      })
    ) {
      return Promise.resolve(response);
    }
    //如果code为10000next
    if (code === 200) {
      return Promise.resolve(response);
    } else if (code === 20001 || code === 20002 || code === 20003 || code === 20018) {
      message.error({ content: msg+',正在跳转登录页面!' , });
      router.push({ path: "/login" });
      return Promise.reject(response);
    } else if (code === 50051) {
      // 后台返回html
      message.error({ content: msg,});
      return Promise.reject(response);
    } else {
      message.error({ content:  msg || "服务器出错！"});
      return Promise.reject(response);
    }
  },
  (error) => {
    if (!error.response) {
      // 请求超时状态
      if (error.message.includes("timeout")) {
        console.log("超时了");
        message.error("请求超时，请检查网络是否连接正常");
      } else {
        // 可以展示断网组件
        console.log("断网了");
        message.error("请求失败，请检查网络是否已连接");
      }
      return;
    }
    // 服务器返回不是 2 开头的情况，会进入这个回调
    // 可以根据后端返回的状态码进行不同的操作
    const responseCode = error.response.status;
    switch (responseCode) {
      // 401：未登录
      case 401:
        // 跳转登录页
        router.replace({
          path: "/login",
          query: {
            redirect: router.currentRoute.fullPath,
          },
        });
        break;
      // 403: token过期
      case 403:
        // 弹出错误信息
        message({
          type: "error",
          content: "登录信息过期，请重新登录",
        });
        // 清除token
        localStorage.removeItem("token");
        // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面
        setTimeout(() => {
          router.replace({
            path: "/login",
            query: {
              redirect: router.currentRoute.fullPath,
            },
          });
        }, 1000);
        break;
      // 404请求不存在
      case 404:
        message({
          content: "网络请求不存在",
          type: "error",
        });
        break;
      case 500:
        message({
          content: error.response.data.msg || "服务器出错！",
          type: "error",
        });
        break;
      // 其他错误，直接抛出错误提示
      default:
        message({
          content: error.response.data.msg,
          type: "error",
        });
    }
    return Promise.reject(error);
  }
);

export default service;
